package br.com.sms.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.sms.conexao.Conexao;
import br.com.sms.dominio.Cliente;
import br.com.sms.dominio.Funcionalidade;
import br.com.sms.dominio.Perfil;
import br.com.sms.enuns.TipoFuncionalidade;

public class PerfilDAO {

	private EntityManager manager;
	private Conexao conexao;

	public PerfilDAO(){
		if(conexao == null)
			conexao = new Conexao();
	}

	public Perfil salvar(Perfil perfil, List<TipoFuncionalidade> tipos){
		manager = conexao.getEntityManger();
		perfil.setFuncionalidades(getFuncionalidades(tipos, this.manager));
		manager.getTransaction().begin();
		if(perfil.getId() > 0){
			Perfil perfil2 = manager.find(Perfil.class, perfil.getId());
			perfil2.setDescricao(perfil.getDescricao());
			perfil2.setFuncionalidades(perfil.getFuncionalidades());
			manager.merge(perfil2);
		}else{
			manager.persist(perfil);
		}
		manager.getTransaction().commit();
		conexao.finalizaConexao();
		return perfil;
	}

	@SuppressWarnings("unchecked")
	private List<Funcionalidade> getFuncionalidades(List<TipoFuncionalidade> tipos, EntityManager manager){
		Query query = manager.createQuery("select f from Funcionalidade f where f.tipoFuncionalidade in (:tipos)");
		query.setParameter("tipos", tipos);
		return query.getResultList();
	}

	public Perfil recuperarPerfil(Perfil perfil){
		manager = conexao.getEntityManger();
		perfil = manager.find(Perfil.class, perfil.getId());
		conexao.finalizaConexao();
		return perfil;
	}

	@SuppressWarnings("unchecked")
	public List<Perfil> recuperarPerfis(){
		manager = conexao.getEntityManger();
		Query query = manager.createQuery("select p from Perfil p ");
		List<Perfil> lista = query.getResultList();
		conexao.finalizaConexao();
		return lista;
	}
	
	@SuppressWarnings("unchecked")
	public List<Perfil> recuperarPerfis(Cliente cliente){
		manager = conexao.getEntityManger();
		Query query = manager.createQuery("select p from Perfil p where p.cliente.id = :cliente");
		query.setParameter("cliente", cliente.getId());
		List<Perfil> lista = query.getResultList();
		conexao.finalizaConexao();
		return lista;
	}

	public void excluir(Perfil perfil) {
		manager = conexao.getEntityManger();
		perfil = manager.find(Perfil.class, perfil.getId());
		manager.getTransaction().begin();
		manager.remove(perfil);
		manager.getTransaction().commit();
		conexao.finalizaConexao();
	}
}
